'use strict';
/**
 * @description 接口不存在插件
 * @author Bluer_Dai
 * */

module.exports = () => {
  return async (ctx, next) => {
    // 获取请求方法和请求的url
    const index = ctx.request.url.indexOf('?');
    let url = ctx.request.url;
    if (index !== -1) {
      url = ctx.request.url.slice(0, ctx.request.url.indexOf('?'));
    }
    // ctx.app.router.stack是该系统所有路由的集合实例
    const flag = ctx.app.router.stack.filter(item => {
      // 在该实例中查找与之匹配的路由
      return (item.regexp.test(url) && item.methods.includes(ctx.request.method.toUpperCase()));
    });

    // 如果找到了匹配的路由或者访问的是公共文件路径则继续执行下面操作，如果没有，则提示接口不存在，不执行下面的操作
    if (flag.length || url.startsWith('/public/uploads')) {
      await next();
    } else {
      ctx.body = {
        status: 404,
        message: '接口 ' + ctx.request.method + '' + url + ' 不存在',
      };
    }
  };
};
